﻿package birdry.utils	{
	import flash.utils.ByteArray;
	
	//	birdry.utils.ArrayUtil;
	
	
	public class ArrayUtil	{
		
		/**
		 * 배열안의 값을 원하는 인덱스로 재정렬한다.
		 * @param	arr
		 * @param	obj
		 * @param	index
		 */
		public static function arrangeByObj(arr:Array, obj:Object, index:uint=0): void	{
			var difference:int = index - arr.indexOf( obj );
			for (var i:uint = 0; i < Math.abs(difference); ++i)	{
				if (difference > 0)	{
					arr.unshift(arr.pop());
				}	else		{
					arr.push(arr.shift());
				}
			}
		}
		
		/**
		 * 중복 배열값 삭제
		 * @param	arr
		 * @return
		 */
		public static function getOnlys(arr:Array):Array {
			
			var object:Object = new Object();
			var i:uint = 0;
			var result:Array = new Array();
			
			while (i < arr.length) {
				if (object[arr[i]] == null)		{
					object[arr[i]] = 0;
					result.push(arr[i]);
				}
				i++;
			}
			return result;
		}

		/**
		 * 배열 복사
		 * @param	array
		 * @return Array
		 */
		public static function returnCopyArr(array:Array): Array	{
			var byteArray:ByteArray = new ByteArray();
			byteArray.writeObject(array);
			byteArray.position = 0;
			return byteArray.readObject();
		}
		
		/**
		 * 촤고값이 들어있는 인덱스값을 반환
		 * @param	arr
		 * @return	uint
		 */
		public static function bestIndex ( arr : Array ):uint		{
			var tempIndex:uint = 0;
			for (var i:uint = 0; i < arr.length; ++i)		{
				if (arr[i] > arr[tempIndex])		{
					tempIndex = i;
				}
			}
			return tempIndex;
		}
		
		
		/**
		 * 배열값중에 원하는 값이 들어있는 인덱스값 반환
		 * @param	array
		 * @param	value
		 * @return
		 */
		public static function searchIndex(array:Array, value:*): uint	{
			return array.indexOf(value);
		}
		
		/**
		* ArrayUtil.shuffle([1,2,3,4,5]);	-->		[2,5,1,3,4]
		* @param	nValue	:	섞이게 될 배열
		* @return
		*/
		public static function shuffle (nValue:Array): void		{
			nValue.sort(randomSort);
			function randomSort( elementA: Object, elementB: Object ): int	{
				return (Math.random() - .5 > 0)	? 1 : -1;
			}
		}
		
		/**
		 * 타겟 숫자로부터 근사한 값이 담긴 배열의 인덱스를 반환
		 * @param	value
		 * @param	arr
		 * @return
		 */
		public static function returnApproximateNumberToIndex(value:Number, arr:Array): uint	{
			var min:uint;
			var max:uint;
			for (var i:uint = 0; i < arr.length; ++i)	{
				max = i;
				if (value < arr[i])	break;
				min = i;
			}
			if (Math.abs(value-arr[min]) > Math.abs(value-arr[max]))	{
				return max;
			}	else 	{
				return min;
			}
		}
		
		/**
		* ArrayUtil.equals([1,2,3], [2,3,1], true);	-->		true
		* @param	arrayA		:	비교할 배열1
		* @param	arrayB		:	비교할 배열2
		* @param	bNotOrdered	:	순서까지 같아야하는지의 유무
		* @return
		*/
		public static function equals (arrayA:Array, arrayB:Array, bNotOrdered:Boolean = false): Boolean	{
			if(arrayA.length != arrayB.length)	{
				return false;
			}
			var arrayACopy:Array = arrayA.concat();
			var arrayBCopy:Array = arrayB.concat();
			
			if(bNotOrdered)	{
				arrayACopy.sort();
				arrayBCopy.sort();
			}
			for( var i:int=0; i<arrayACopy.length; ++i)	{
				if( arrayACopy[i] != arrayBCopy[i] )	{
					return false;
				}
			}
			return true;
		}

	
	
	}	// class
}	// package